<?php
/**
 * Created by PhpStorm.
 * User: liuda
 * Date: 2018/6/1
 * Time: 18:20
 */

namespace app\index\controller;
use think\Controller;
header("Content-type: text/html; charset=utf-8");
class Api extends Controller{

    /**
     * 获取类型
     * */
    public function getType(){
        if($this->request->isPost()) {
            $type = new \app\index\model\Typefile();
            $where = array();
            $where['status'] = 1;
            $field = '*';
            $list = $type->getList($where, $field);
//            echo $type->getLastSql();exit;
            if ($list) {
                return flag(200, "获取成功", $list);
            } else {
                return flag(404, "暂无数据");
            }
        }else{
            return flag(401, "请求失败");
        }

    }
    /**
     * 获取某类型下的文件
     * @param type int 类型id
     * */
    public function getFile(){
        if($this->request->isPost()){
            $param = $this->request->param();
            $type = $param['type'];
            if(!isset($type)||empty($type)) return $this->flag(402, "type不能为空！");
            $model = new \app\index\model\Files();
            $where['type'] = $type;
            $field = '*';
            $list = $model->getList($where,$field,$order='id desc');
            if ($list) {
                return flag(200, "获取成功", $list);
            } else {
                return flag(404, "获取失败");
            }
        }else{
            return flag(401, "请求失败");
        }
    }
    /**
     * 获取某分类下的数据结构
     * */
    public function getFiles(){
        if($this->request->isPost()){
            $param = $this->request->param();
            $type = $param['type'];
            if(!isset($type)||empty($type)) return $this->flag(402, "type不能为空！");
            $model = new \app\index\model\Files();
            $typeModel = new \app\index\model\Typefile();
            $where = array();
            $where['parent_id'] = $type;
            $typeArr = $typeModel->getList($where, '*');
            if($typeArr){
                foreach ($typeArr as $k=>$v){
                    $child = $model->getList(array('stype'=>$v['id']),'*');
                    $typeArr[$k]['child'] = $child;
                }
                return flag(200, "获取成功", $typeArr);
            }else{

                return flag(404, "获取失败");
            }

        }else{
            return flag(401, "请求失败");
        }


    }

    /**
     * 下载接口
     * */
    //压缩文件
    function zip(){
        //获取文件id 通过id获取文件路径
        if($this->request->isPost()){
            $param = $this->request->param();
            $idString = trim($param['idstring'],',');//图纸id 以','隔开
            $company = $param['company'];//公司名
            $remark = $param['remark'];//备注
            $fid = $param['fid'];//图纸id
            if(!isset( $idString)||empty( $idString)) return flag(402, "请选择文件,再进行下载");
            if(!isset( $company)||empty( $company)) return flag(402, "请输入公司名");
            //根据图纸id 获取图纸路径
            $Model = new \app\index\model\Files();
            $where['id'] = array('in',$idString);
            $pathArr = $Model->getList($where,'path');
            $downtime = date('Ymd',time());
            //通过fid 获取类型id  通过类型id 获取类型名称
            $fileInfo = $Model->getOne(array('a.id'=>$fid),'*');
            if(!isset( $remark)||empty( $remark)){
                $remark = '';
            }
            $baseUrl = ROOT_PATH.'public/zip/';
            if($remark){
                $zipName = $baseUrl.$company.'_'.$fileInfo["name"].'_'.$remark.'_'.$downtime.".zip";

            }else{
                $zipName = $baseUrl.$company.'_'.$fileInfo["name"].'_'.$downtime.".zip";
            }
            $zip = new \ZipArchive;//使用本类，linux需开启zlib，windows需取消php_zip.dll前的注释
            /*
             * 通过ZipArchive的对象处理zip文件
             * $zip->open这个方法如果对zip文件对象操作成功，$zip->open这个方法会返回TRUE
             * $zip->open这个方法第一个参数表示处理的zip文件名。
             * 这里重点说下第二个参数，它表示处理模式
             * ZipArchive::OVERWRITE 总是以一个新的压缩包开始，此模式下如果已经存在则会被覆盖。
             * ZIPARCHIVE::CREATE 如果不存在则创建一个zip压缩包，若存在系统就会往原来的zip文件里添加内容。
             *
             * 这里不得不说一个大坑。
             * 我的应用场景是需要每次都是创建一个新的压缩包，如果之前存在，则直接覆盖，不要追加
             * so，根据官方文档和参考其他代码，$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE
             * 问题来了，当这个压缩包不存在的时候，会报错：ZipArchive::addFile(): Invalid or uninitialized Zip object
             * 也就是说，通过我的测试发现，ZipArchive::OVERWRITE 不会新建，只有当前存在这个压缩包的时候，它才有效
             * 所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)
             *
             * 以上总结基于我当前的运行环境来说
             * */
            /*if ($zip->open($zipName1, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE){
                return flag(403, "无法打开文件，或者文件创建失败");
            }*/

            if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE){
                return flag(403, "无法打开文件，或者文件创建失败");
            }
            foreach($pathArr as $key=>$val){
                //$attachfile = $attachmentDir . $val['filepath']; //获取原始文件路径
                if(file_exists($val['path'])){
                    //addFile函数首个参数如果带有路径，则压缩的文件里包含的是带有路径的文件压缩
                    //若不希望带有路径，则需要该函数的第二个参数
                    $zip->addFile($val['path'],basename($val['path']));//第二个参数是放在压缩包中的文件名称，如果文件可能会有重复，就需要注意一下
                }
            }
            $zip->close();//关闭
            if(!file_exists($zipName)){
                return flag(403, "无法找到文件");
            }
            //如果不要下载，下面这段删掉即可，如需返回压缩包下载链接，只需 return $zipName;
            /*header("Cache-Control: public");
            header("Content-Description: Files Transfer");
            header('Content-disposition: attachment; filename='.basename($zipName)); //文件名
            header("Content-Typefile: application/zip"); //zip格式的
            header("Content-Transfer-Encoding: binary"); //告诉浏览器，这是二进制文件
            header('Content-Length: '. filesize($zipName)); //告诉浏览器，文件大小
            @readfile($zipName);*/
           //处理返回路径
//            var_dump($_SERVER['HTTP_HOST'].'/downfile/public/zip/'.basename($zipName));exit;
            //处理返回路径
            $zipName1 = str_replace('/var/www/html','http://192.168.1.133',$zipName);
            return flag(200, "获取成功",$zipName1);
        }else{
            return flag(401, "请求失败");
        }
    }
}